﻿#define  _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>


//假设环境是x86环境，程序输出的结果是啥？
//#include <stdio.h>
//int main()
//{
//	int a[5][5];
//
//	int(*p)[4]; //p是一个数组指针，p指向的数组是四个整型元素的
//
//	p = a;  //a单独放在这是二维数组的数组名，数组名代表首元素地址，也就是第一行的地址int(*p)[5]
//
//	printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]); //指针-指针，绝对值等到的是指针和指针之间的元素个数
//
//	return 0;
//}

//-4  1000 0000 0000 0000 0000 0000  0000 0100 
//    1111 1111 1111 1111 1111 1111  1111 1011
//    1111 1111 1111 1111 1111 1111  1111 1100  = 0xfffffffc


//#include <stdio.h>
//int main()
//{
//	int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//	int* ptr1 = (int*)(&aa + 1);  //&aa代表取出整个数组的地址,整个数组的地址加1跳过整个数组
//
//	int* ptr2 = (int*)(*(aa + 1)); //aa不是单独放，代表首元素的地址，数组首元素的地址就是第一行的地址,类型是int(*p)[5]，*(aa+1)等价于aa[1]，表示第二行的数组名，数组名代表首元素的地址aa[1]也是&aa[1][0]
//
//	printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));  //10 5
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char* a[] = { "work","at","alibaba" }; //a是一个数组，数组元素类型是char*，代表存放的都是首元素的地址，也就是'w','a','a'
//	char** pa = a;  //a代表首元素的地址，首元素的地址是'w'
//	pa++;           //pa加1跳过一个元素，指向at
//	printf("%s\n", *pa);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char* c[] = { "ENTER","NEW","POINT","FIRST" };
//	char** cp[] = { c + 3,c + 2,c + 1,c }; //"FIRST"  "POINT"  "NEW"  "ENTER"
//	char*** cpp = cp;  //"FIRST"
//	printf("%s\n", **++cpp); //POINT
//	printf("%s\n", *-- * ++cpp + 3); //cpp++ 
//	printf("%s\n", *cpp[-2] + 3);  //**(cpp-2) + 3
//	printf("%s\n", cpp[-1][-1] + 1);  //*(*(cpp-1) -1) + 1 
//	return 0;
//}

//int main()
//{
//	int a = 10;
//	int b = a + 1; //b = 11 ,a = 10
//	printf("%d %d\n",a,b);
//	b = ++a;  //b= 11,a = 11
//	printf("%d %d\n", a, b);
//
//	return 0;
//}


//字符分类函数
#include<ctype.h>
#include<string.h>

//写⼀个代码，将字符串中的⼩写字⺟转⼤写，其他字符不变。

//int main()
//{
//	int i = 0;
//	char str[] = "XiaoBite DaMengXiang";
//	char c;
//	while (str[i])
//	{
//		c = str[i];
//		if (islower(c))
//			//c -= 32;
//			c = toupper(c);
//			putchar(c);
//			i++;
//
//	}
//	return 0;
//}

//strlen模拟实现方法：计数器模式
#include<assert.h>
//size_t my_strlen1(const char* arr)
//{
//	size_t count = 0;
//	assert(*arr != '\0');
//	while (*arr != '\0')
//	{
//		count++;
//		arr++;
//	}
//	return count;
//}
//
////strlen模拟实现方法：指针减去指针
//size_t my_strlen2(const char* arr)
//{
//	const char* start = arr;
//	assert(*arr != '\0');
//	while (*arr != '\0')
//	{
//		arr++;
//	}
//	return arr - start;
//}
//
////strlen模拟实现方法：函数递归
//size_t my_strlen(const char* arr)
//{
//	assert(arr);
//	if (*arr == '\0')
//		return 0;
//	else
//		return 1 + my_strlen(arr + 1);
//}
//
//int main()
//{
//	char arr[] = "abcdefgh";
//	size_t str = my_strlen(arr);
//	printf("%zd",str);
//	return 0;
//}


//strcpy 字符串拷贝
//char* strcpy(char * destination, const char * source );
//                    目的地                     源头   ，将源头的字符串复制给目的地

//char* my_strcpy(char* des, const char* sou)
//{
//	char* ret = des;
//	assert(des!=NULL);
//	assert(sou!=NULL);
//	
//	while (*des++ = *sou++)
//	{
//		;
//	}
//
//	return ret;
//
//}
//int main()
//{
//	char arr1[30] = "defxyz";
//	char arr2[30] = "abc";
//	my_strcpy(arr2, arr1);
//	printf("%s",arr2);
//	return 0;
//}

//strcat 函数用来连接字符串
char* my_strcat(char* des, const char* res)
{
	char* ret = des;
	assert(des != NULL);
	assert(res != NULL);
	
	while (*des)
	{
		des++;
	}

	while (*des++ = *res++)
	{
		;  //空语句
	}
	return ret;
}
int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world";
	my_strcat(arr1, arr2);
	printf("%s",arr1);
	return 0;
}


